home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / source_ / 2devchec.s next >
Text File  |  1998-10-01  |  2KB  |  93 lines

  1. *--------------------------------------------------------------------
  2. * デバイスドライバー常駐チェック関数2
  3. *--------------------------------------------------------------------
  4.  
  5.     .include    iocscall.mac
  6.     .xref        GetNulPoint
  7.  
  8.     .text
  9.  
  10. * int DevCheck2(unchar *sdev,unchar *devname)
  11. * sdev : 隠しデバイス名
  12. * devname : 実際のデバイス名を格納するエリア
  13. * devname=NULLなら格納しない
  14. *--------------------------------------------------------------------
  15.  
  16.     .xdef    _DevCheck2
  17. _DevCheck2:
  18. * 指定のデバイスドライバが存在するかどうかを調べる(キャラクターデバイス専用)
  19. * 4(sp) <- 調べる隠しデバイス名
  20. *          $00で終わる文字列でも8文字のデバイス名そのものでもどちらでも良い
  21. * 8(sp) <- 本来のデバイス名を格納するワークエリア
  22. *       [8+1]以上を確保すること
  23. *       NULLの時は格納しない。
  24. * リターン値
  25. *    d0.l:存在しているかどうか    a0:デバイスヘッダーアドレス
  26. *     = $00 ... 存在していない     不変
  27. *     = $ff ... 存在している         見つけたデバイスドライバーのヘッダーアドレス
  28.     movem.l    4(sp),d0/d1
  29.     movem.l    d7/a1-a5,-(sp)
  30.     move.l    d0,a2        * 隠しデバイス名
  31.     move.l    d1,a5        * 本来のデバイス名格納エリア
  32.     *
  33.     * 比較するデバイス名の長さを得る -> d7.w
  34.     move.l    a2,a1
  35.     moveq.l    #-1,d7        * 名前比較のdbraのため
  36. @@:    move.b    (a1)+,d0
  37.     beq    @f
  38.     cmp.b    #' ',d0
  39.     beq    @f
  40.     addq.w    #1,d7
  41.     cmp.w    #8-1,d7
  42.     bcs    @b
  43. @@:    *
  44.     sub.l    a1,a1        * a1.l=0
  45.     IOCS    _B_SUPER    * super visor mode
  46.     move.l    d0,-(sp)
  47.     *
  48.     bsr    GetNulPoint    * -> a1(NUL)
  49.     *
  50. @@:    lea    22(a1),a3    * 隠しデバイス名
  51.     move.l    a2,a4
  52.     move.w    d7,d0
  53. 1:    cmp.b    (a4)+,(a3)+
  54.     dbne    d0,1b
  55.     beq    FoundDev    * 一致
  56. NextDev:            * 不一致
  57.     move.l    (a1),a1        * 次へ
  58.     cmp.l    #-1,a1
  59.     bne    @b
  60.     * 見つからなかった
  61.     moveq.l    #0,d7        * a0は不変
  62.     move.b    d7,(a5)        * デバイス名なし($00)
  63.     bra.s    @f
  64.     *
  65. FoundDev:            * 見つかった
  66.     move.l    a1,a0        * デバイスヘッダーアドレス
  67.     st.b    d7        * 見つかった
  68.     * 本来のデバイス名を転送する
  69.     cmp.l    #0,a5
  70.     beq    @f        * NULL指定なら転送しない
  71.     *
  72.     lea    14(a0),a4    * デバイス名
  73.     moveq.l    #8-1,d2        * -1 dbra
  74. 3:    move.b    (a4)+,d1
  75.     cmp.b    #' ',d1        * ' 'の直前まで
  76.     beq    2f
  77.     move.b    d1,(a5)+
  78.     dbra    d2,3b        * または8バイトまで
  79. 2:    clr.b    (a5)        * EOS
  80.     *
  81. @@:    move.l    (sp)+,d0
  82.     bmi    @f        * 元からsuper visorであった
  83.     move.l    d0,a1
  84.     IOCS    _B_SUPER    * user mode
  85. @@:    *
  86.     moveq.l    #0,d0        * for .b = .l
  87.     move.b    d7,d0
  88.     movem.l    (sp)+,d7/a1-a5
  89.     rts
  90.  
  91. *--------------------------------------------------------------------
  92.     .end
  93.